//
// Created by 29245 on 2025/8/14.
//

#include "PS2.h"
#include "stdint.h"
#include "stm32f1xx_hal.h"
 #include "delay.h"
/*********************************************************
*											PS2手柄头文件
*										手柄接口接线介绍：
*										DI ->PB12 （MOSI）
*										DO ->PB13 （MISO）
*										CS ->PB14 （CS）
*										CLK->PB15 （SCLK）
**********************************************************/


#include "PS2.h"
#include "delay.h"
#include "main.h"


//PS2手柄的输入输出口
#define DI()     HAL_GPIO_ReadPin(DI_GPIO_Port, DI_Pin)              //数据输入引脚

#define CMD_H()  HAL_GPIO_WritePin(DO_GPIO_Port, DO_Pin, GPIO_PIN_SET)   //命令位高
#define CMD_L()  HAL_GPIO_WritePin(DO_GPIO_Port, DO_Pin, GPIO_PIN_RESET) //命令位低

#define CS_H()   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)   //CS拉高(别名ATT)
#define CS_L()   HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET) //CS拉低(别名ATT)

#define CLK_H()  HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET) //时钟拉高
#define CLK_L()  HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET) //时钟拉低


int PS2_LX,PS2_LY,PS2_RX,PS2_RY;
const  uint8_t PS2_cmnd[9] = {0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};   //请求获取数据命令
static uint8_t PS2_data[9] = {0};  //接收的数据


/**
  * @简  述  PS2初始化
  * @参  数  无
  * @返回值  无
  */
/**
  * @简  述  PS2初始化
  * @参  数  无
  * @返回值  无
  */
void AX_PS2_Init(void)
{
	// 使用CubeMX配置的GPIO，无需在此处初始化GPIO
	// 只需要确保在main函数中调用了MX_GPIO_Init()

	// 关闭PS2手柄使能
	CS_H();
}

/**
  * @简  述  PS2数据读写函数
  * @参  数  cmd:要写入的命令
  * @返回值  读出数据
  */
static uint8_t PS2_ReadWriteData(uint8_t cmd)
{
	volatile uint8_t res = 0;
	volatile uint8_t ref;

	//写入命令，并读取一个1字节数据
	for(ref = 0x01; ref > 0x00; ref <<= 1)
	{
		////输出一位数据
		if(ref&cmd)
			CMD_H();
		else
			CMD_L();

		CLK_L();
		delay_us(16);

		//读取一位数据
		if(DI())
			res |= ref;
		CLK_H();
		delay_us(16);
	}

	//返回读出数据
    return res;
}

/**
  * @简  述  PS2获取按键及摇杆数值。
  * @参  数  *JoystickStruct 手柄键值结构体
  * @返回值  无
  */
void AX_PS2_ScanKey(PS2_TypeDef *ps2)
{
	uint8_t i;

	//使能手柄
	CS_L();

	//读取PS2数据
	for(i=0; i<9; i++)
	{
		PS2_data[i] = PS2_ReadWriteData(PS2_cmnd[i]);
	}

	//关闭使能
	CS_H();

	//数值传递
	ps2->mode = PS2_data[1];
	ps2->btn1 = ~PS2_data[3];
	ps2->btn2 = ~PS2_data[4];
	ps2->R_X = PS2_data[5];
	ps2->R_Y = PS2_data[6];
	ps2->L_X = PS2_data[7];
	ps2->L_Y = PS2_data[8];
}















